package 进阶阶段;

import java.util.*;

/**
 * 创建人：刘源江
 * 类描述：
 * 创建时间：2022/8/12 23:10
 **/

public class demo12Map双列集合 {
    public static void main(String[] args) {
        //Map双列集合：元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成，通过键可以找对所对应的值。
        //Map中的集合不能包含重复的键，值可以重复；每个键只能对应一个值
        //Map集合特点：无序的，通过键得到值，要求键是唯一的，跟值无关
        //键值对：Key-Valse
        //双列集合类的子接口，分别是无序的HashMap和有序的LinkedHashMap

        //put(K key, V value): 把指定的键与指定的值添加到Map集合中。//增也是它,改也是它,键唯一,值覆盖,有覆盖就返回被覆盖的旧的值,没有覆盖返回null表示
        //remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除，返回被删除元素的值。
        //get(Object key)：根据指定的键，在Map集合中获取对应的值。如果没有键,没有值,绑定,返回null表示
        //keySet(): 获取Map集合中所有的键，存储到Set集合中。即键的集合
        //put(Map m)：将一个Map集合中的元素全部添加到另一个Map集合中
        //entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。即键值对类的对象的集合,存的是每一个键值对对象,模拟键值对,得
                                        //到每一个键和每一个值的方法,键值对类里面写了,模拟键值对,由键和值组成,自然可以得到键和得到值的方法

        HashMap hashMap = new HashMap();
        hashMap.put('男' , true);
        hashMap.put(11 , 3.14);
//        hashMap.put(11 , 3.15);//错误案例：包含了11相同的键，不能包含重复的键
        hashMap.put(1 , "宋祖儿");
        hashMap.put(2 , "蔡卓妍");

        hashMap.remove(1);

        Object o = hashMap.get(2);
        System.out.println(o);

        Set set = hashMap.keySet();
        System.out.println(set);

        Set set1 = hashMap.entrySet();
        System.out.println(set1);

        System.out.println(hashMap);

        HashMap hashMap1 = new HashMap();
        hashMap1.putAll(hashMap);
        System.out.println(hashMap1);

        System.out.println("------------------------------");

        //遍历Map集合
        //第一种方法：先通过keySet()方法拿到键的集合，再循环通过get()方法，用key找到所有的valse，在打印出来
        System.out.println("遍历Map集合第一种方法");
        Set keySet = hashMap.keySet();
        for (Object key : keySet) {
            Object o1 = hashMap.get(key);
            System.out.println(o1);
        }

        //第二种方法：通过values()方法拿到值的集合，增强for循环打印出来
        System.out.println("遍历Map集合第二种方法");
        Collection values = hashMap.values();
        for (Object a : values) {
            System.out.println(a);
        }

        //第三种方法，通过entrySet()拿到键值对的集合，在对象中获得key或者valse再打印出来
        System.out.println("遍历Map集合第三种方法");
        Set<Map.Entry<Object , Object>> entrySet =  hashMap.entrySet();
        for (Map.Entry<Object , Object> en : entrySet){
            Object key = en.getKey();
            Object value = en.getValue();
            System.out.println(key + ":" + value);
        }

        //打印出Map键值对//2=蔡卓妍、男=true、11=3.14
        System.out.println("遍历Map集合的键值对");
        Set set2 = hashMap.entrySet();
        //增强for循环打印键值对的集合
        for (Object a : set2) {
            System.out.println(a);
        }

        System.out.println("------------------------------");
        //LinkedHashMap：有序,怎么存就怎么取
        LinkedHashMap linkedHashMap = new LinkedHashMap();
        linkedHashMap.put(1 , "a");
        linkedHashMap.put(2 , "b");
        linkedHashMap.put(3 , "c");
        linkedHashMap.put(4 , "d");

        System.out.println(linkedHashMap);

    }
}
